﻿#pragma once

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventAdapter>
#include <osgGA/TrackballManipulator>
#include <osgGA/CameraManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>

#include "NodeMatrix.h"
#include <osgUtil/IntersectionVisitor>

class TravelManipulator : public osgGA::CameraManipulator
{
public:
	TravelManipulator();

public:
	// 实现得到和设置矩阵的接口 - 必须实现
	// 设置当前视口
	virtual void setByMatrix(const osg::Matrixd& matrix) override;
	// 设置当前视口的逆矩阵
	virtual void setByInverseMatrix(const osg::Matrixd& matrix) override;
	// 获取当前矩阵
	virtual osg::Matrixd getMatrix() const override;
	// 得到当前的逆矩阵
	virtual osg::Matrixd getInverseMatrix() const override;

	// 响应事件
	virtual bool handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv);

	// 设置步长
	void setStep(int step);

	// 得到步长
	int getStep();

	// 设置到某一点
	void setPosition(osg::Vec3d& position);

	// 设置碰撞节点
	void setNode(osg::Node* node);

	// 设置是否自动检测物体
	void setAuto(bool bauto);

	// 设置当前的第三人称物体
	void setCurrentNode(NodeMatrix* node);


private:
	// 视点
	osg::Vec3d m_vPosition;
	osg::Vec3d m_vPersonPosition; // 第三人称视角，人物位置
	// 朝向 (欧拉角)
	osg::Vec3 m_vRotation; // 相机默认是朝着-Z轴方向看的，摄像机右边指向+X轴，上方指向+Y轴。
	// 移动步长
	int m_vStep;
	// 旋转步长
	float m_vRotateStep;
	// 记录坐标
	int m_iLeftX;
	int m_iLeftY;
	bool m_bLeftDown;

	// 进行碰撞检测节点
	osg::Node* m_node;
	// 当前物体
	NodeMatrix* m_nCurrentNode;
	bool m_bAuto;


	// 改变位置
	void ChangePosition(osg::Vec3d& delta);
};

